home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / datatypes / mrekodt / src / classbase.c next >
C/C++ Source or Header  |  1996-04-07  |  3KB  |  112 lines

  1. /*
  2. **    classbase.c - implementation of standard function for REKO DataType class
  3. **    Copyright © 1995 Michael Letowski
  4. */
  5.  
  6. #include <exec/types.h>
  7. #include <exec/libraries.h>
  8. #include <exec/semaphores.h>
  9. #include <dos/dos.h>
  10. #include <support/types.h>
  11.  
  12. #include <proto/exec.h>
  13. #include <proto/intuition.h>
  14.  
  15. #include "classbase.h"
  16. #include "dispatch.h"
  17.  
  18. #define INT_NAME        "intuition.library"
  19. #define INT_VERN        39
  20. #define GFX_NAME        "graphics.library"
  21. #define GFX_VERN        39
  22. #define DOS_NAME        "dos.library"
  23. #define DOS_VERN        39
  24. #define UTIL_NAME        "utility.library"
  25. #define UTIL_VERN        39
  26. #define DT_NAME            "datatypes.library"
  27. #define DT_VERN            39
  28.  
  29. ASM Class *ObtainREKOEngine(R_A6 struct ClassBase *cb)
  30. {
  31.     return(cb->cb_Class);
  32. }    /* ObtainREKOEngine */
  33.  
  34. ASM struct ClassBase *LibInit(R_D0 struct ClassBase *cb, R_A0 BPTR segList,
  35.                                                             R_A6 struct Library *sysBase)
  36. {
  37.     cb->cb_SegList=segList;
  38.     cb->cb_SysBase=sysBase;
  39.     InitSemaphore(&cb->cb_Lock);                                    /* Initialize locking */
  40.     try(cb->cb_IntuitionBase=OpenLibrary(INT_NAME,INT_VERN),    NO_INT);
  41.     try(cb->cb_GfxBase=OpenLibrary(GFX_NAME,GFX_VERN),                NO_GFX);
  42.     try(cb->cb_DOSBase=OpenLibrary(DOS_NAME,DOS_VERN),                NO_DOS);
  43.     try(cb->cb_UtilityBase=OpenLibrary(UTIL_NAME,UTIL_VERN),    NO_UTIL);
  44.     return(cb);
  45.  
  46.     except(NO_UTIL,    CloseLibrary(cb->cb_UtilityBase));
  47.     except(NO_DOS,    CloseLibrary(cb->cb_DOSBase));
  48.     except(NO_GFX,    CloseLibrary(cb->cb_GfxBase));
  49.     except(NO_INT,    CloseLibrary(cb->cb_IntuitionBase));
  50.     return(NULL);
  51. }    /* LibInit */
  52.  
  53. ASM struct ClassBase *LibOpen(R_A6 struct ClassBase *cb)
  54. {
  55.     ObtainSemaphore(&cb->cb_Lock);                                /* Protect library base */
  56.     fclr(cb->cb_Lib.lib_Flags,LIBF_DELEXP);                /* No delayed expunge */
  57.  
  58.     if(cb->cb_Lib.lib_OpenCnt==0 && cb->cb_Class==NULL)
  59.     {                                                                                            /* First open */
  60.         try(cb->cb_DataTypesBase=OpenLibrary(DT_NAME,DT_VERN),        NO_DT);
  61.         try(cb->cb_Class=InitClass(cb),                                                        NO_CLASS);
  62.     }
  63.  
  64.     cb->cb_Lib.lib_OpenCnt++;                                            /* Mark successfull opening */
  65.     ReleaseSemaphore(&cb->cb_Lock);                                /* Data modified */
  66.     return(cb);                                                                        /* Return success */
  67.  
  68.     except(NO_CLASS,FreeClass(cb->cb_Class));
  69.     except(NO_DT,        CloseLibrary(cb->cb_DataTypesBase));
  70.     ReleaseSemaphore(&cb->cb_Lock);                                /* Unlock base */
  71.     return(NULL);                                                                    /* Return failure */
  72. }    /* LibOpen */
  73.  
  74. ASM BPTR LibClose(R_A6 struct ClassBase *cb)
  75. {
  76.     BPTR Seg=0;
  77.  
  78.     ObtainSemaphore(&cb->cb_Lock);                                /* Protect library base */
  79.     if(cb->cb_Lib.lib_OpenCnt)
  80.         cb->cb_Lib.lib_OpenCnt--;                                        /* Decrease open count */
  81.     if(cb->cb_Lib.lib_OpenCnt==0 && cb->cb_Class)
  82.         if(FreeClass(cb->cb_Class))
  83.         {
  84.             cb->cb_Class=NULL;
  85.             CloseLibrary(cb->cb_DataTypesBase);
  86.         }
  87.         else
  88.             fset(cb->cb_Lib.lib_Flags,LIBF_DELEXP);
  89.     if(ftst(cb->cb_Lib.lib_Flags,LIBF_DELEXP))        /* Delayed expunge set? */
  90.         Seg=LibExpunge(cb);
  91.     ReleaseSemaphore(&cb->cb_Lock);                                /* Unlock base */
  92.     return(Seg);
  93. }    /* LibClose */
  94.  
  95. ASM BPTR LibExpunge(R_A6 struct ClassBase *cb)
  96. {
  97.     BPTR Seg=0;
  98.  
  99.     if(cb->cb_Class==NULL)                                                /* No accesors? */
  100.     {
  101.         Seg=cb->cb_SegList;
  102.         Remove((struct Node *)cb);                                    /* Remove from library list */
  103.         CloseLibrary(cb->cb_UtilityBase);
  104.         CloseLibrary(cb->cb_DOSBase);
  105.         CloseLibrary(cb->cb_GfxBase);
  106.         CloseLibrary(cb->cb_IntuitionBase);
  107.         FreeMem((APTR)((ULONG)(cb)-(ULONG)(cb->cb_Lib.lib_NegSize)),
  108.                         cb->cb_Lib.lib_NegSize + cb->cb_Lib.lib_PosSize);
  109.     }
  110.     return(Seg);
  111. }    /* LibExpunge */
  112.